﻿		;Ejemplos de funciones matemáticas
		;
		;Ver. 1.00	11/02/2014
		
		;-----------------------------------------------------------------------
		;	TIPOS DE DATOS
		;-----------------------------------------------------------------------
		;Entero:	16 bit signado		de -32768 a 32767
		;Largo:		32 bit signado		de 2147483648 al 2147483647
		;Real:		32 bit				-3.4028235E+38 a -1.401298E-45 y 1.401298E-45 a 3.4028235E+38
		
		;-----------------------------------------------------------------------
		;	SUMAS
		;-----------------------------------------------------------------------
		
		;Suma enteros
		; int_2 = int_1 + int_2
		LD int_1						;int_1 -> Acumulador
		ADD int_2						;Acumulador = Acumulador + int_2
		ST int_2						;Acumulador -> int_2
		
		;Suma de largos
		; lng_2 = lng_1 + lng_2
		LD lng_1						;lng_1 -> Acumulador
		ADD lng_2						;Acumulador = Acumulador + lng_2
		ST lng_2						;Acumulador -> lng_2
		
		;Suma de reales
		; sng_2 = sng_1 + sng_2
		LD sng_1						;sng_1 -> Acumulador
		ADD sng_2						;Acumulador = Acumulador + sng_2
		ST sng_2						;Acumulador -> sng_2
		
		;Suma entero a largo
		; lng_2 = int_1 + lng_2
		LD int_1						;int_1 -> Acumulador (es convertido en Largo automáticamente
		ADD lng_2						;Acumulador = Acumulador + lng_2
		ST lng_2						;Acumulador -> lng_2
		
		;Largo + Real -> Largo
		R_TO_DI sng_1, lng_1			;Convierte sng_1 en largo, y lo pone en lng_1
		LD lng_1						;lng_1 -> Acumulador
		ADD lng_2						;Acumulador = Acumulador + lng_2
		ST lng_2						;Acumulador -> lng_2
		
		;Largo + Real -> Real
		DI_TO_R lng_1, sng_1			;Convierte lng_1 en real, y lo pone en sng_1
		LD sng_1						;sng_1 -> Acumulador
		ADD sng_2						;Acumulador = Acumulador + sng_2
		ST sng_2						;Acumulador -> sng_2

		;-----------------------------------------------------------------------
		;	ERRORES EN SUMAS
		;-----------------------------------------------------------------------
		;MAL:	Largo + Real
		LD lng_1						;lng_1 -> Acumulador
		ADD sng_2						;El dato en el acumulador NO es compatible con un real,
		ST sng_2						;por lo tanto el resultado no es el esperado

		;MAL:	Largo + Entero -> Entero
		LD lng_1						;lng_1 -> Acumulador
		ADD int_2						;Acumulador = Acumulador + int_2 (int_2 es automáticamente convertido)
		ST int_2						;Solo los primeros 16bits pasan a int_2, los otros 16 quedan en el acumulador
		
		;MAL:	Digital + Digital -> Digital
		LD d_0
		ADD d_1							;Las variable digitales NO se pueden usar en aritmética
		ST d_2
		
		;-----------------------------------------------------------------------
		;	CONVERTIR A NEGATIVO
		;-----------------------------------------------------------------------
		LD 0							;El acumulador adopta el valor cero (entero y largo)
		LD 0.0							;El acumulador adopta el valor cero en real
		
		LD 0							;0 -> Acumulador
		SUB int_1						;Acumulador = Acumulador - int_1
		ST int_1						;Ahora int_1 tiene valor negativo
		
		LD 0.0							;0 -> Acumulador
		SUB sng_1						;Acumulador = Acumulador - sng_1
		ST sng_1						;Ahora sng_1 tiene valor negativo
		
		;-----------------------------------------------------------------------
		;	SUMAR CONSTANTES
		;-----------------------------------------------------------------------
		ADD 10							;Acumulador = Acumulador + 10 (indistinto entero o largo)
		
		ADD 10.0						;Igual que el anterior, pero tratado como real
		
		
		;-----------------------------------------------------------------------
		;	ESCALADO
		;-----------------------------------------------------------------------
		;Escalado básico                Valor * km
		;                   Escalado = ————————————
		;                                   kd
		
		;MAL:
		;Si int_1 = 1000, km = 5, y kd = 256
		; 1000 / 256 = 3
		; 3 * 5 = 15
		LD int_1						;Valor a escalar
		DIV kd							;Se pierde precisión, ya que no hay decimales
		MUL km
		ST int_2						;Valor escalado
		
		;BIEN:
		;Si int_1 = 1000, km = 5, y kd = 256
		; 1000 * 5 = 5000
		; 5000 / 256 = 19
		LD int_1						;Valor a escalar
		MUL km							;Al multiplicar primero se conserva la información
		DIV kd
		ST int_2						;Valor escalado
		
		;Con coma flotante el resultado sería 19.53
		
		;BIEN:
		LD int_1						;Valor a escalar
		SCALE km, kd					;SCALE hace la operación en el orden correcto
		ST int_2						;Valor escalado
		